Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

WinDbg

帖子发起人: iNarcissuss   发起时间: 2009-06-30 09:07 上午   回复: 2

Print Search
帖子排序:    
   2009-06-30, 09:07 上午
iNarcissuss 离线,最后访问时间: 2010/6/7 5:45:00 iNarcissuss

发帖数前500位
注册: 2007-09-10
发 贴: 2
Windbg的显示物理内存的!dd命令的问题
Reply Quote
大家好

最近我写程序中用到了MmMapIoSpace来读取某块物理内存的内容

在调试中我想验证一下读得对不对,所以就用了 !dd aPhysicalAddress 命令,但是windbg提示如下内容:

kd> !dd e9000
physical memory read at e9000 failed
If you know the caching attributes used for the memory,
try specifying Coffee [C], [uc] or [wc], as in !dd Coffee [C] <params>.
WARNING: Incorrect use of these flags will cause unpredictable
processor corruption. This may immediately (or at any time in
the future until reboot) result in a system hang, incorrect data
being displayed or other strange crashes and corruption.

然后我就加了参数Coffee [C],发现果然能正确显示,后来又试了[uc] [wc]参数,发现三者显示的内容都一样,

MmMapIoSpace读出来的内容也一样

我就很奇怪,加了这三个参数与不加参数有什么区别么?其中的原理是什么?不加那三个参数时windbg是从哪里

读取物理内存的内容呢?为什么有时候会显示错误信息呢?

后来google了一下,MS的Andre Vachon这样说

This is by design on windows XP.  You must read the message and do what it
says.
-Andre

那么为什么要这么设计呢?

希望各位牛牛有时间的话,给我指点一下迷津,或者推荐一些资料,或者说说应该查找什么方面的资料都可以

谢谢



IP 地址: 已记录   报告
   2009-07-15, 09:52 上午
iNarcissuss 离线,最后访问时间: 2010/6/7 5:45:00 iNarcissuss

发帖数前500位
注册: 2007-09-10
发 贴: 2
Re: Windbg的显示物理内存的!dd命令的问题
Reply Quote
汗。。。

我的人品差到这种程度。。。
IP 地址: 已记录   报告
   2009-07-16, 21:09 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: Windbg的显示物理内存的!dd命令的问题
Reply Quote
Don't feel frustrated :-)
的确没有看过官方的文档说明其中的原因,但是看一下内核中供调试用的内存访问函数就可以知道答案了(当然是看汇编)。

对于读取物理内存的请求(DbgKdReadPhysicalMemoryApi),KD需要调用
MiDbgTranslatePhysicalAddress函数来获取指定物理地址所对应的线性地址,因为在保护模式下,CPU是没有办法直接读取物理地址的,总是要先将其映射到页表和页目录中,因为这个原因,如果要读地址已经映射过,那么!dd命令中不加Cache选项就可以读取成功;但是如果要读的物理地址还没有映射过,那么就需要将其映射到专用于调试的一套页目录和页表中,在映射时需要制定Cache选项,这些信息是登记到PTE中的,所以当!dd命令读取这样的物理内存时就需要指定Cache选项。

因为Cache选项是影响内存瞬态的选项,比如是否可以对内存做高速缓存(是<img src="/emoticons/emotion-44.gif" alt="Coffee [C]" />,不是[uc]),而在调试时,如果内存的值没有变化,那么是否Cache没什么影响,所以读到的值都一样是合乎情理的。



IP 地址: 已记录   报告
高端调试 » 软件调试 » WinDbg » Windbg的显示物理内存的!dd命令的问题

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.